package com.atguigu.tingshu.user.service;

import com.atguigu.tingshu.model.user.UserInfo;
import com.atguigu.tingshu.model.user.UserPaidAlbum;
import com.atguigu.tingshu.model.user.UserPaidTrack;
import com.atguigu.tingshu.vo.user.UserCollectVo;
import com.atguigu.tingshu.vo.user.UserInfoVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public interface UserInfoService extends IService<UserInfo> {

    /**
     * 调用微信接口进行登录
     * @param code 临时登录凭证,我们根据这个code可以和微信服务器交互获取openId
     * @return 用户登录信息内容
     */
    HashMap<String, Object> wxLogin(String code);

    /**
     * 刷新token
     * @return token的map集合
     */
    Map<String, Object> refreshToken();

    /**
     * 获取登录成功的用户的信息
     * @return 用户信息
     */
    UserInfoVo getUserInfo();

    /**
     * 修改用户信息
     * @param userInfoVo 用户的修改对象vo
     */
    void updateUser(UserInfoVo userInfoVo);

    /**
     * [rpc]
     * 远程调用，根据用户id获取用户信息
     * @param userId
     * @return
     */
    UserInfoVo getUserInfoVoByUserId(Long userId);


    /**
     * [rpc]
     * 根据用户id和专辑id，获取用户购买过的音频数据集合
     * @param userId 用户id
     * @param albumId 专辑id
     * @return 用户购买过的音频数据集合
     */
    List<UserPaidTrack> getUserPaidTrackList(Long userId, Long albumId);


    /**
     * [rpc]
     * 根据用户id和专辑id，获取用户购买过的专辑信息集合
     * @param userId 用户id
     * @param albumId 专辑id
     * @return 用户购买过的音频数据集合
     */
    List<UserPaidAlbum> getUserPaidAlbumList(Long userId, Long albumId);


    /**
     * 根据音频id获取当前用户是否收藏了这条音频
     * @param trackId 音频id
     * @return 是否收藏
     */
    Boolean isCollect(Long trackId);


    /**
     * 当前用户点击收藏按钮触发的接口
     * @param trackId 音频id
     * @return
     */
    Boolean collect(Long trackId);


    /**
     * 根据当前用户id和专辑id判断当前用户是否订阅当前专辑
     * @param albumId 专辑id
     * @return 当前用户是否订阅专辑
     */
    Boolean isSubscribe(Long albumId);


    /**
     * 根据用户id展示用户分页收藏列表
     * @return 分页收藏列表
     */
    IPage<UserCollectVo> findUserCollectPage(IPage<UserCollectVo> page, Long userId);
}
